<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>语句</title>
</head>
<body>
    <script>
        "use strict";
        /*
            ECMA-262规定了一组语句（也称为流控制语句）。从本质上看语句定义了ECMAScript中的主要语法，语句通常使用一个或多个关键字来完成指定任务。
            语句可以很简单，例如通知函数退出；也可以比较复杂，例如指定重复执行某个命令的次数。

            if语句：
                大多数变成语言中最为常用的语句就是if语句。以下是if语句的语法：
                    if (condition) { statement1 } else { statement2 }
                
                其中的condition条件可以是任意表达式；而且对这个表达式求值的结果不一定是布尔值。ECMAScript会自动调用Boolean()转换函数
                将这个表达式的结果转换为一个布尔值。如果对condition求值的结果是true，则是执行statement1（语句1），如果是false，则执行
                statement2（语句2）。而且这个语句既可以是一行代码，也可以是一个代码块。

                不过业界推崇最佳的实践是始终使用代码块，即使要执行的只有一行代码。因为这样可以消除人们的误解，否则可能让人分不清在不同条件下执行那些代码。

                也可以向下面这样，将整个if语句写在一行语句中：
                    if (condition1) statement1 else if (condition2) statement2 else statement3;

                但是，更推荐以下写法：
                    if (condition1) {
                        statement1;
                    } else if(condition2) {
                        statement2;
                    } else {
                        statement3;
                    }

            do-while语句：
                do-while语句是一种后测试循环语句，即只有在循环体中的代码执行之后，才会测试出口条件。换句话说，在对条件表达式求值之前，
                循环体内的代码至少会被执行一次。以下是do-while语句的语法：
                    do {
                        statement;
                    } while (expression);

                下面是一个示例：
                    var i = 0;
                    do {
                        i += 2;
                    } while (i < 10);

                    console.log(i);

                在这个例子中，只要变量i的值小于10，循环就会一直执行下去。而且变量i的值最初是0，每次循环都会递增2。
            
            while语句：
                while语句属于前测试循环语句，也就是说在循环体内的代码在执行之前，就会对出口条件求值。因此循环体内的代码有可能永远不会被执行。
                以下是while语句的语法：
                    while (expression) { statement; }

                下面是一个示例：
                    var i = 0;
                    while (i < 10) {
                        i += 2;
                    }
                
                在这个例子中，变量i的开始值是0，每次循环都会递增2。而只要i的值小于10，循环就会继续下去。
            
            for语句：
                for语句也是一种前测试循环语句，但它具有在执行循环语句之前初始化变量和定义循环后要执行的代码的能力。
                以下是for语句的语法：
                    for (initialization; expression; post-loop-expression) {
                        statement;
                    }

                下面是一个示例：
                    var count = 10;
                    for (var i = 0; i < count; i++) {
                        console.log(i);
                    }
                
                以上代码定义了i的初始值为0,。只有当条件表达式返回true的情况下才会进入for循环，因此，也有可能不会执行循环体中的代码。
                如果执行了循环体中的代码，则一定会对循环后的表达式求值，即递增i的值。这个for循环语句与下面的while语句功能相同：
                    var count = 10
                    var i = 0;
                    while (i < count) {
                        console.log(i);
                        i++;
                    }
                
                使用while循环做不到的，使用for循环同样也做不到。也就是说for循环只是把与循环相关的代码集中在了一个位置。
                有必要指出的是，在for循环的变量初始化表达式中，也可以不使用var关键字。该变量的初始化可以在外部执行，例如：
                    var count = 10;
                    var i;
                    for (i = 0; i < count; i++) {
                        console.log(i);
                    }

                以上代码与在循环表达式中初始化声明变量的效果是一样的。由于ECMAScript中不存在块级作用域（ES5中不存在块级作用域），因此循环
                内部中定义的变量也可以在外部访问到。例如：
                    var count = 10;
                    for (var i = 0; i < count; i++) {
                        console.log(i);
                    }
                    console.log(i); // 10

                for语句中的初始化表达式、控制表达式和循环后表达式都是可选的。将这三个表达式全部省略，就会创建一个无线循环：
                    for (;;) { // 无线循环
                        doSomething();
                    }

                而只给出控制表达式实际上就把for循环转成了while循环，例如：
                    var count = 10;
                    var i = 0;
                    for( ;i < count; ) {
                        console.log(i);
                        i++;
                    }

            for-in语句：
                for-in语句是一种精准的迭代语句，可以用来枚举对象的属性。以下是for-in语句的语法：
                    for (property in expression) { statement; }
                
                下面是一个示例：
                    for (var propName in window) {
                        console.log(propName);
                    }
                
                在这个例子中，我们使用for-in循环来显示了DOM中window对象的所有属性。每次执行循环时，都会将window对象中存在的一个属性名赋值给变量
                propName。这个过程会持续到对象中的所有属性都被枚举一遍为止。与for语句类似，这里控制语句中的操作符var也不是必须的。但是，为了保证
                使用局部变量，推荐使用var操作符。

                ECMAScript对象的属性没有顺序。因此，通过for-in循环输出的属性名的顺序是不可预测的。具体来讲，所有属性都会被返回一次，但返回的先后
                次序可能因浏览器而异。

                但是，如果表示要迭代的对象为null值或undefined值，for-in语句会抛出错误。ECMAScript5更正了这一行为：对这种情况下不再抛出错误，
                而是不执行循环体。为了保证最大限度的兼容性，建议在使用for-in语句之前，先检查改对象的值是不是null或undefined。

            label语句：
                使用label语句可以在代码中添加标签，以便将来使用。以下是label语句的语法：
                    label : statement

                下面是一个示例：
                    start: for (var i = 0; i < 10; i++) {
                        console.log(i);
                    }
                
                这个例子中定义的start标签可以在将来有break或continue语句引用。加标签的语句一般都要与for语句等循环语句配合使用。

            break和continue语句：
                break和continue语句用于在循环中精确地控制代码的执行。其中，break语句会立即退出循环，强制继续执行循环后面的语句。
                而continue语句虽然也是立即退出循环，但是退出循环后会从循环的顶部继续执行。
                示例：
                    
                    var num = 0；
                    for (var i = 0; i < 1-; i++) {
                        if (i % 5 == 0) {
                            break; // 退出循环
                        }
                        num++;
                    }
                    console.log(num); // 4

                示例2：
                    
                    var num = 0;
                    for (var i = 0; i < 10; i++) {
                        if (i % 5 == 0) {
                            break; // 退出本次循环，继续执行下一次循环
                        }
                        num++;
                    }
                    console.log(num); // 8

                breake和continue语句都可以配合label语句来使用，从而返回代码中的特定位置，这种联合使用的情况多发生在循环嵌套的情况下。
                示例：
                    
                    var num = 0;
                    outermost:
                    for (var i = 0; i < 10; i++) {
                        for (var j = 0; j < 10; j++) {
                            if (i == 5 && j == 5) {
                                break outermost; // 退出循环
                            }
                            num++;
                        }
                    }

                    console.log(num); // 55
                
                示例2：
                    
                    var num = 0;
                    outermost:
                    for (var i = 0; i < 10; i++) {
                        for (var j = 0; j < 10; j++) {
                            if (i == 5 && j == 5) {
                                continue outermost; // 退出outermost本次循环，继续执行下一次循环
                            }
                            num++;
                        }
                    }

                    console.log(num); // 95

        */
    </script>
</body>
</html>